// AC 完美
#include <bits/stdc++.h>
using namespace std;
const int mx = 1e6 + 10; // 定义最大数值范围
int cnt[mx];             // 计数数组，记录每个数值出现的次数

void solve() {
  int n, d; // n: 数字数量, d: 模数
  cin >> n >> d;
  // 读取输入并统计每个数字出现的次数
  for (int i = 0; i < n; i++) {
    int val;
    cin >> val;
    cnt[val]++;
  }
  // 处理d=0的特殊情况(所有相同数字只能保留一个)
  if (d == 0) {
    int dup = 0; // 统计不同数字的数量
    for (int i = 0; i < mx; i++)
      dup += (cnt[i] > 0);
    cout << n - dup << '\n'; // 输出需要删除的数量(总数-不同数字数)
    return;
  }

  int ans = 0;
  // 对每个余数分组处理(0到d-1)
  for (int i = 0; i < d; i++) {
    // 计算当前余数分组的大小
    int group_size = (mx - i) / d + 2;

    vector<vector<int>> dp(group_size, vector<int>(2, 0));
    dp[0][0] = 0; // 初始状态：不取
    dp[0][1] = 0; //  初始状态：取

    int idx = 0;
    for (int j = i; j < mx && idx + 1 < group_size; j += d) {
      idx++;
      // 不取当前数字：前一个可以取或不取
      dp[idx][0] = min(dp[idx - 1][0], dp[idx - 1][1]) + cnt[j];
      // 取当前数字：前一个必须不取
      dp[idx][1] = dp[idx - 1][0];
    }
    // cout << "idx: " << idx << '\n';               // 输出当前余数分组的大小
    // cout << "dp[idx][0]: " << dp[idx][0] << '\n'; // 输出不取当前数字的最小值
    // cout << "dp[idx][1]: " << dp[idx][1] << '\n'; // 输出取当前数字的最小值
    ans += min(dp[idx][0], dp[idx][1]);
  }
  cout << ans << '\n'; // 输出需要删除的最小数量
}

int main() {
  ios::sync_with_stdio(0), cin.tie(0); // 加速输入输出
  solve();
  return 0;
}
